﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>


//void* my_memcpy(void* dst, void* src, int num)
//{
//	assert(dst && src);
//	void* ret = dst;
//
//	for (int i = 0; i < num; i++)
//	{
//		*((char*)dst + i) = *((char*)src + i);
//	}
//
//	return ret;
//}
//
//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[20] = { 0 };
//	my_memcpy(arr2, arr1, sizeof(int) * 5);
//
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}

void* my_memmove(void* dst, void* src, int num)
{
	assert(dst && src);
	void* ret = dst;

	// 如果复制空间地址比目标空间地址小
	// 就从后往前复制，防止重叠部分在复制前就被修改了
	if (src < dst)
	{
		for (int i = num - 1; i >= 0; i--)
		{
			*((char*)dst + i) = *((char*)src + i);
		}
	}
	// 如果复制空间地址比目标空间地址大 或 两空间不重叠
	// 就从前往后复制，防止重叠部分在复制前就被修改了
	else
	{
		for (int i = 0; i < num; i++)
		{
			*((char*)dst + i) = *((char*)src + i);
		}
	}
	return ret;
}

int main()
{
	int arr1[20] = { 1,2,3,4,5 };
	my_memmove(arr1 + 3, arr1, sizeof(int) * 5);

	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}